package es.tikitaka.actions.equipos;

import java.util.List;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.faces.FacesMessages;

import es.tikitaka.dao.AniosDicService;
import es.tikitaka.dao.EquipoService;
import es.tikitaka.dao.TemporadaService;
import es.tikitaka.dictionary.AniosDic;
import es.tikitaka.domain.Temporada;
import es.tikitaka.domain.equipo.Equipo;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Name("equipoSearch")
@Scope(ScopeType.CONVERSATION)
public class EquipoSearch {

	private int modo;

	private Equipo equipoElim;
	private Equipo equipoBaja;
	private Equipo equipoAlta;

	private String nombre;
	private AniosDic fundacion;
	private Temporada temporada;
	private int activo = 1;

	private int totalRes;

	private List<AniosDic> listaAnios;
	private List<Temporada> listaTemporadas;

	@DataModel("equipos")
	private List<Equipo> equipos;
	@DataModelSelection("equipos")
	private Equipo equipoItem;

	@In(create = true)
	private EquipoService equipoService;

	@In(create = true)
	private AniosDicService aniosService;

	@In(create = true)
	private TemporadaService temporadaService;

	/**
	 * Constructor por defecto
	 */
	public EquipoSearch() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * Método que inicializa la variable modo para que en la pantalla de
	 * búsqueda se cargen las opciones de eliminar
	 */
	public void modoEliminar() {
		modo = 1;
		cargaOpcionesBusqueda();
	}

	/**
	 * Método que inicializa la variable modo para que en la pantalla de
	 * búsqueda se cargen las opciones de edición
	 */
	@Begin(join = true, flushMode = FlushModeType.MANUAL)
	public void modoEdicion() {
		modo = 2;
		cargaOpcionesBusqueda();
	}

	/**
	 * Método que inicializa la variable modo para que en la pantalla de
	 * búsqueda se cargen las opciones de consulta
	 */
	@Begin(join = true, flushMode = FlushModeType.MANUAL)
	public void modoConsulta() {
		modo = 3;
		cargaOpcionesBusqueda();
	}

	/**
	 * Método que inicializa la variable modo para que en la pantalla de
	 * búsqueda se cargen las opciones de alta
	 */
	@Begin(join = true, flushMode = FlushModeType.MANUAL)
	public void modoAlta() {
		modo = 4;
		cargaOpcionesBusqueda();
	}

	/**
	 * Método que inicializa la variable modo para que en la pantalla de
	 * búsqueda se cargen las opciones de baja
	 */
	@Begin(join = true, flushMode = FlushModeType.MANUAL)
	public void modoBaja() {
		modo = 5;
		cargaOpcionesBusqueda();
	}

	/**
	 * Método que carga las opciones en la pantalla de búsqueda de colegiados
	 */
	public void cargaOpcionesBusqueda() {
		listaAnios = aniosService.getList();
		listaTemporadas = temporadaService.getList();
	}

	/**
	 * Método para buscar los equipos según los criterios de consulta
	 */
	public void buscar() {

		StringBuffer s = new StringBuffer();

		if (modo == 4) {
			// Busca los equipos que se encuentran inactivos en este momento
			s
					.append("select e from Equipo e left join fetch e.m_participaciones p left join fetch p.temporada t where e.activo = 'false' ");
		} else if (modo == 5) {
			// Busca los equipos que se encuentran activos en este momento
			s
					.append("select e from Equipo e left join fetch e.m_participaciones p left join fetch p.temporada t where e.activo = 'true' ");
		} else {
			// Busca todos los equipos independientemente del estado
			if (activo == 1) {
				s
						.append("select e from Equipo e left join fetch e.m_participaciones p left join fetch p.temporada t where e.activo = 'true' ");
			} else if (activo == 2) {
				s
						.append("select e from Equipo e left join fetch e.m_participaciones p left join fetch p.temporada t where e.activo = 'false' ");
			}
		}

		if (nombre != null && nombre.length() > 0) {
			s.append("and upper(e.nombre) like upper('%'||?1||'%') ");
		}
		if (fundacion != null) {
			s.append("and e.fundacion.id = ?2 ");
		}
		if (temporada != null) {
			s.append("and t.id =?3 ");
		}

		s.append("order by e.nombre");

		equipos = equipoService.buscar(nombre, fundacion, temporada, s);
		totalRes = equipos.size();

	}

	/**
	 * Método que selecciona un equipo para su eliminación
	 * 
	 * @param equipo
	 *            Equipo a eliminar
	 */
	public void eliminar(Equipo equipo) {
		equipoElim = equipo;
	}

	/**
	 * Método que elimina a un equipo del sistema
	 */
	public void eliminar() {
		if (equipoElim != null) {
			if (equipoElim.getM_participaciones() != null
					&& equipoElim.getM_participaciones().size() > 0) {
				FacesMessages
						.instance()
						.add(
								"No se puede eliminar el equipo porque tiene datos de temporadas.");
			} else {
				boolean b = equipoService.delete(equipoElim.getId());
				if (b) {
					equipos.remove(equipoElim);
					totalRes = equipos.size();
					FacesMessages
							.instance()
							.add(
									"El equipo seleccionado se ha eliminado correctamente.");
				} else {
					FacesMessages.instance().add(
							"El equipo no se ha podido eliminar del sistema.");
				}
			}
		}
	}

	/**
	 * Método que selecciona a un equipo para su alta
	 * 
	 * @param equipo
	 *            Equipo a dar de alta
	 */
	public void alta(Equipo equipo) {
		equipoAlta = equipo;
	}

	/**
	 * Método para dar de alta un equipo en el sistema
	 */
	public void alta() {
		if (equipoAlta != null) {
			equipoAlta.setActivo(true);
			boolean b = equipoService.save(equipoAlta);
			if (b) {
				equipos.remove(equipoAlta);
				totalRes = equipos.size();
				FacesMessages.instance().add(
						"El equipo ha sido dado de alta correctamente.");
			} else {
				FacesMessages
						.instance()
						.add(
								"Se ha producido un error y no se ha podido dar el alta al equipo.");
			}
		} else {
			FacesMessages.instance().add(
					"No hay ningún equipo seleccionado para dar el alta");
		}
	}

	/**
	 * Método que selecciona a un equipo para su baja
	 * 
	 * @param equipo
	 *            Equipo a dar de baja
	 */
	public void baja(Equipo equipo) {
		equipoBaja = equipo;
	}

	/**
	 * Método para dar de baja un colegiado en el sistema
	 */
	public void baja() {
		if (equipoBaja != null) {
			equipoBaja.setActivo(false);
			boolean b = equipoService.save(equipoBaja);
			if (b) {
				equipos.remove(equipoBaja);
				totalRes = equipos.size();
				FacesMessages.instance().add(
						"El equipo ha sido dado de baja correctamente.");
			} else {
				FacesMessages
						.instance()
						.add(
								"Se ha producido un error y no se ha podido dar la baja al equipo.");
			}
		} else {
			FacesMessages.instance().add(
					"No hay ningún equipo seleccionado para dar la baja");
		}
	}

	/**
	 * Método para limpiar los criterios de búsqueda del formularios
	 */
	public void limpiar() {
		nombre = null;
		fundacion = null;
		temporada = null;
		equipos = null;
		activo = 1;
	}

	/**
	 * Método para inicializar todos los parámetros al volver al menú de equipos
	 */
	@End
	public void volver() {
		limpiar();
	}

	/**
	 * Método para inicializar todos los parámetros al volver al menú principal
	 */
	@End
	public void menu() {
		limpiar();
	}

	/*
	 * getters and setters
	 */

	/**
	 * 
	 * @return
	 */
	public int getModo() {
		return modo;
	}

	/**
	 * 
	 * @param modo
	 */
	public void setModo(int modo) {
		this.modo = modo;
	}

	/**
	 * 
	 * @return
	 */
	public Equipo getEquipoElim() {
		return equipoElim;
	}

	/**
	 * 
	 * @param equipoElim
	 */
	public void setEquipoElim(Equipo equipoElim) {
		this.equipoElim = equipoElim;
	}

	/**
	 * 
	 * @return
	 */
	public Equipo getEquipoBaja() {
		return equipoBaja;
	}

	/**
	 * 
	 * @param equipoBaja
	 */
	public void setEquipoBaja(Equipo equipoBaja) {
		this.equipoBaja = equipoBaja;
	}

	/**
	 * 
	 * @return
	 */
	public Equipo getEquipoAlta() {
		return equipoAlta;
	}

	/**
	 * 
	 * @param equipoAlta
	 */
	public void setEquipoAlta(Equipo equipoAlta) {
		this.equipoAlta = equipoAlta;
	}

	/**
	 * 
	 * @return
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * 
	 * @param nombre
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * 
	 * @return
	 */
	public AniosDic getFundacion() {
		return fundacion;
	}

	/**
	 * 
	 * @param fundacion
	 */
	public void setFundacion(AniosDic fundacion) {
		this.fundacion = fundacion;
	}

	/**
	 * 
	 * @return
	 */
	public Temporada getTemporada() {
		return temporada;
	}

	/**
	 * 
	 * @param temporada
	 */
	public void setTemporada(Temporada temporada) {
		this.temporada = temporada;
	}

	/**
	 * 
	 * @return
	 */
	public int getActivo() {
		return activo;
	}

	/**
	 * 
	 * @param activo
	 */
	public void setActivo(int activo) {
		this.activo = activo;
	}

	/**
	 * 
	 * @return
	 */
	public int getTotalRes() {
		return totalRes;
	}

	/**
	 * 
	 * @param totalRes
	 */
	public void setTotalRes(int totalRes) {
		this.totalRes = totalRes;
	}

	/**
	 * 
	 * @return
	 */
	public List<AniosDic> getListaAnios() {
		return listaAnios;
	}

	/**
	 * 
	 * @param listaAnios
	 */
	public void setListaAnios(List<AniosDic> listaAnios) {
		this.listaAnios = listaAnios;
	}

	/**
	 * 
	 * @return
	 */
	public List<Temporada> getListaTemporadas() {
		return listaTemporadas;
	}

	/**
	 * 
	 * @param listaTemporadas
	 */
	public void setListaTemporadas(List<Temporada> listaTemporadas) {
		this.listaTemporadas = listaTemporadas;
	}

	/**
	 * 
	 * @return
	 */
	public List<Equipo> getEquipos() {
		return equipos;
	}

	/**
	 * 
	 * @param equipos
	 */
	public void setEquipos(List<Equipo> equipos) {
		this.equipos = equipos;
	}

	/**
	 * 
	 * @return
	 */
	public Equipo getEquipoItem() {
		return equipoItem;
	}

	/**
	 * 
	 * @param equipoItem
	 */
	public void setEquipoItem(Equipo equipoItem) {
		this.equipoItem = equipoItem;
	}

}
